package main
import ( "fmt"
"os"
"io"
"bufio"
)

// 定义一个结构体保存统计结果
type CharCount struct {
	ChCount int //记录英文个数
	NumCount int //数字个数
	SpaceCount int //空格个数
	OtherCount int //其他字符
}

func main() {
	
	// 思路：打开一个文件，创一个Reader
	// 每读取一行就统一该行的字符
	// 将结果保存到一个结构体
	fileName := "f:/abc.txt"
	file,err := os.Open(fileName)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
		return
	}
	defer file.Close()
	// 定义CharCount实例
	var count CharCount
	// 创建一个reder
	reader := bufio.NewReader(file)
	// 循环读取fileName内容
	for {
		str,err := reader.ReadString('\n')
		if err == io.EOF {
			// 读取到了文件末尾就退出
			break
		}
		// 兼容中文，将str转为[]rune
		newStr := []rune(str)
    // 遍历str,统计
		for _,v :=range newStr {
			switch {
				case v >= 'a' && v <= 'z':
				fallthrough //穿透
				case v >= 'A' && v <= 'Z':
				count.ChCount++
				case v == ' ' || v == '\t':
				count.SpaceCount++
				case v >= '0' && v <= '9':
				count.NumCount++
				default :
				count.OtherCount++
			}
		}
	}
	//输出统计的结果看看是否正确
	fmt.Printf("字符的个数为=%v 数字的个数为=%v 空格的个数为=%v 其它字符个数=%v", count.ChCount, count.NumCount, count.SpaceCount, count.OtherCount)
}
